golang slice到底是值传递还是引用传递?
答案:值传递
下面通过几个例子分析一下:
1 | slice := []int{1, 2, 3} |
如上代码会有如下输出,可以看到subSlice改变了原来slice的值,那么是不是slice就是指针传递呢?
1 | before the origin slice address=0xc000090000 |
请看上述代码的简单修改版:
1 | slice := []int{1, 2, 3} |
会发现有如下输出:可以发现,subSlice并未改变slice的值,并且他们的地址也发生了变化。这个问题的本质原因是什么呢?
1 | before the origin slice address=0xc00008a000 |
本质原因:第一个代码subSlice在做修改的时候,并未超过slice的容量,所以所有的修改都会反映到slice的底层数组上。
但是第二个代码在做append的时候,已经超过了subSlice的容量,底层数组已经放不下了,所以需要扩容,当扩容的时候,newSlice的地址就与之前的地址不一致了。
所以对他的改变就不会体现到原有slice上,所以slice本质上还是值传递。
v1.5.2